/*
更新日期：2017、03、09
作者：盛彬
备注信息：
内存用纯手动设置的方式
缓存库缓存内容应该包括所有需要缓存的数据 尽可能把需要new的参数都放在这里 尽量
注意使用的开发三方库环境: ffmpeg322、opencv320

模块调整为负责处理所有的信息保存和内存放置， 图像识别也需要增加消耗方面的控制
稍微优化一下软件结构 尽可能简化流程，便于自己理解  多少要有点架构方面意识
*/
#pragma once
#include "AllHeader.hpp"
#include "ConfigInfo.hpp"
#include "AVFramePPFifo.hpp"
#include "libLog.hpp"
#include "SwsContextPP.hpp"
#include "Parser.hpp"

#ifndef libGlobalBuffer_H
#define libGlobalBuffer_H

class libIntelligentParser :public libLog
{
public:
    libIntelligentParser();
    ~libIntelligentParser();

    int ReadConfig(string _config_filename);//加载配置文件
    int SetParamFromAVFormatContext(AVFormatContext *_input_ctx);

    int InitGlobalBuffer(string _config_filename);

    int WriteVideoFrame(AVFrame *_frame);
    int WriteAudioFrame(AVFrame *_frame);

    int ReadVideoFrame(AVFrame *_frame, int64_t &_frame_index);//直接把frame导出来  注意读写交错不要出问题 注意逻辑准确  图片的加工也放到这里
    int ReadAudioFrame(AVFrame *_frame);

    int ReadVideoFrame(AVFramePP &_framepp, int64_t &_frame_index);//直接把frame导出来  注意读写交错不要出问题 注意逻辑准确  图片的加工也放到这里
    int ReadAudioFrame(AVFramePP &_framepp);

    int GetVideoBufferPercent();
private:
    int ProcessPicture(AVFrame *_frame, int64_t _index);
    int DeleteParserPack(int64_t _index, ParserPack2 &_dst_pp);

    int parser_sampling{ 0 };

    SwsContextPP sws_format2bgr;
    SwsContextPP sws_bgr2format;
public:
    libConfigInfo CI;
    libParser PS;

    int input_stream_numbers{ 0 };
    uint input_video_stream_index, input_audio_stream_index;
    AVRational input_video_stream_timebase, input_audio_stream_timebase;
    AVCodecParameters *input_video_codecpar{ nullptr }, *input_audio_codecpar{ nullptr }; //先留着，用于全局参考
    AVRational input_videostream_rate; // video only 输入帧率信息经常有误，故单独抽出处理

    AVCodecParameters *v264_codecpar{ nullptr }, *v265_codecpar{ nullptr }, *aac_codecpar{ nullptr };//输出用 配置都在这里准备好吧
private:
    AVFramePPFifo video_fifo;
    AVFramePPFifo audio_fifo;
};

#endif //libGlobalBuffer_H